#! /bin/bash -e

. usage.sh

# faust2mathdoc.sh
#
# Generate a full Faust documentation, in a '*-mdoc' top directory.
#
# Karim Barkati
# November 2009
#
#   Warning : this script requires several things to be installed :
# - svg2pdf, from the Cairo 2D graphics library;
# - pdflatex, to compile the tex file;
# - breqn, a latex package to break equations;
# - faust ;-)

# Usage.
echoHelp()
{
    usage faust2mathdoc "[options] <file.dsp>"
    require svg2pdf pdflatex breqn
    echo "Generate a full Faust documentation in a '*-mdoc' top directory"
    option
    option "-l LANG" "LANG is usually a 2-lowercase-letters language name, like en, fr, or it."
    option -utf8 "force file.dsp to be recoded in UTF-8 before being processed"
    exit
}

# Visit each directory transmitted as argument,
# in order to convert process.svg files into pdf.
# This function uses the svg2pdf command,
# from the Cairo 2D graphics library.
convert_svgprocesses2pdf()
{
    for DIR in $@ ; do
    if [ -d $DIR ] ; then
        echo "cd " $DIR
        cd $DIR
        FILE="process.svg"
        for SRC in $FILE ; do
        echo ' --> '$SRC
        PDF=${SRC%.svg}'.pdf'
        ##svg2pdf "$SRC" "$PDF"
        inkscape --without-gui --file="$SRC" --export-pdf="$PDF"
        echo ' <-- '$PDF
        done
        cd -
    else
        echo error : \'$DIR\' is not a directory.
    fi
    done
}

# Visit each directory transmitted as argument,
# in order to convert .svg files into pdf.
# This function uses the svg2pdf command,
# from the Cairo 2D graphics library.
convert_svgdirs2pdf()
{
    for DIR in $@ ; do
    if [ -d $DIR ] ; then
        #echo "cd " $DIR
        cd $DIR
        FILES=`ls | grep -E "\.svg"`
        for SRC in $FILES ; do
        #echo ' --> '$SRC
        PDF=${SRC%.svg}'.pdf'
        ##svg2pdf "$SRC" "$PDF"
        inkscape --without-gui --file="$SRC" --export-pdf="$PDF"
        echo "svg2pdf $SRC $PDF"
        #echo ' <-- '$PDF
        done
        cd ..
    else
        echo error : \'$DIR\' is not a directory.
    fi
    done
}

# In-place recoding of a text file from its current encoding to UTF-8.
# This is useful for .dsp files with accents in comments that are coded
# with a different character set.
recode2utf8()
{
    charset=`file -0 --mime-encoding $1 | cut  -d' ' -f2`
    recode $charset..utf-8 $1
}

MDLANGOPT=""
if [ $1 = "-mdlang" ] || [ $1 = "--mathdoc-lang" ] || [ $1 = "-l" ]
then
    MDLANGOPT="-mdlang $2"
    shift 2
fi

CONVERT=""
if [ "$1" = "-utf8" ] || [ "$1" = "--utf8" ]
then
    CONVERT="utf8"
    shift 1
fi

if [ "$#" -eq 0 ]; then
    echo 'Please, provide a Faust file to process !'
    echo ''
    echoHelp
fi

#    Main loop of this script :
# 1. Compile `faust --mathdoc` to generate the TeX file and SVG block-diagrams.
# 2. Move to the "${FILEPATH%.dsp}-mdoc" directory created by faust.
# 3. Convert SVG files into PDF files recursively (with svg2pdf).
# 4. Compile pdflatex twice (including the top-level block-diagram).
# 5. Copy some important files where needed.
for FILEPATH in $@ ; do
    if [ -f $FILEPATH ] ; then
    FILENAME=`basename $FILEPATH` &&
    case $FILENAME in
        *.dsp )
        if [ "$CONVERT" = "utf8" ]
        then
            recode2utf8 $FILENAME
        fi
        faust $MDLANGOPT -o ${FILEPATH%.dsp}.cpp --mathdoc $FILEPATH  || exit
        cd ${FILEPATH%.dsp}-mdoc/ &&
        cd svg && convert_svgprocesses2pdf svg-* && cd .. &&
        cd tex && xelatex ${FILENAME%.dsp}.tex && xelatex ${FILENAME%.dsp}.tex && cd .. &&
        mkdir -p pdf && cp tex/${FILENAME%.dsp}.pdf pdf &&
        mkdir -p cpp && mv ../${FILENAME%.dsp}.cpp cpp &&
        cd ..
        ;;
        * )
        echo error : \'$FILENAME\' does not have a \'.dsp\' extension.
        exit 2
        ;;
    esac
    else
        echoHelp
    fi
done
exit 0

